#ifndef MODBUSCONTROLLER_H
#define MODBUSCONTROLLER_H

#include <QObject>
#include <QMap>
#include "services/ModbusService.h"
#include "services/DataCollector.h"
#include "models/DeviceModel.h"
#include "models/DataRecordModel.h"
#include "entities/Device.h"

/**
 * @brief Modbus 控制器
 * @details Controller 层，协调 Modbus 通信业务流程：
 *          - 连接/断开设备（调用 ModbusService）
 *          - 管理多设备连接（支持多设备并发）
 *          - 启动/停止数据采集（调用 DataCollector）
 *          - 协调 Service 与 Model 层
 *          - 暴露 Q_INVOKABLE 方法给 QML 调用
 */
class ModbusController : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString currentDeviceId READ currentDeviceId NOTIFY currentDeviceIdChanged)
    Q_PROPERTY(bool isConnected READ isConnected NOTIFY isConnectedChanged)
    Q_PROPERTY(QString connectionStatus READ connectionStatus NOTIFY connectionStatusChanged)

public:
    explicit ModbusController(QObject *parent = nullptr);
    ~ModbusController();

    // 设置关联的 Model
    void setDeviceModel(DeviceModel *model);
    void setDataRecordModel(DataRecordModel *model);

    // 属性访问器
    QString currentDeviceId() const { return m_currentDeviceId; }
    bool isConnected() const { return m_isConnected; }
    QString connectionStatus() const { return m_connectionStatus; }

    // 连接到设备
    Q_INVOKABLE bool connectToDevice(const QString &deviceId);

    // 断开设备连接
    Q_INVOKABLE void disconnectFromDevice(const QString &deviceId);
    Q_INVOKABLE void disconnectCurrentDevice();
    Q_INVOKABLE void disconnectAllDevices();

    // 启动/停止数据采集
    Q_INVOKABLE bool startDataCollection(const QString &deviceId, int intervalMs = 1000);
    Q_INVOKABLE void stopDataCollection(const QString &deviceId);

    // 读取单次数据（不启动定时采集）
    Q_INVOKABLE bool readDeviceData(const QString &deviceId);

    // 获取设备连接状态
    Q_INVOKABLE bool isDeviceConnected(const QString &deviceId) const;
    Q_INVOKABLE bool isDeviceCollecting(const QString &deviceId) const;

    // 获取已连接设备列表
    Q_INVOKABLE QStringList getConnectedDevices() const;

    // 切换当前设备
    Q_INVOKABLE void switchToDevice(const QString &deviceId);

signals:
    // 属性变化信号
    void currentDeviceIdChanged();
    void isConnectedChanged();
    void connectionStatusChanged();

    // 连接相关信号
    void deviceConnected(const QString &deviceId);
    void deviceDisconnected(const QString &deviceId);
    void deviceConnectionFailed(const QString &deviceId, const QString &error);

    // 数据采集相关信号
    void dataCollectionStarted(const QString &deviceId);
    void dataCollectionStopped(const QString &deviceId);
    void dataCollectionFailed(const QString &deviceId, const QString &error);

    // 数据更新信号
    void newDataReceived(const QString &deviceId);

private slots:
    // ModbusService 信号处理
    void onDeviceConnected();
    void onDeviceDisconnected();
    void onDeviceConnectionError(const QString &error);

    // DataCollector 信号处理
    void onDataCollected(const DataPoint &dataPoint);
    void onCollectionSuccess(const QString &deviceId);
    void onCollectionFailed(const QString &deviceId, const QString &error);

private:
    // 创建设备的 ModbusService
    ModbusService *createModbusService(const QString &deviceId);

    // 创建设备的 DataCollector
    DataCollector *createDataCollector(const QString &deviceId);

    // 获取设备的 ModbusService
    ModbusService *getModbusService(const QString &deviceId) const;

    // 获取设备的 DataCollector
    DataCollector *getDataCollector(const QString &deviceId) const;

    // 清理设备资源
    void cleanupDevice(const QString &deviceId);

    // 更新连接状态
    void updateConnectionStatus(const QString &status);

private:
    DeviceModel *m_deviceModel;         // 设备模型
    DataRecordModel *m_dataRecordModel; // 实时数据模型

    // 多设备管理
    QMap<QString, ModbusService *> m_modbusServices; // 设备ID → ModbusService
    QMap<QString, DataCollector *> m_dataCollectors; // 设备ID → DataCollector

    // 当前状态
    QString m_currentDeviceId;  // 当前选中的设备ID
    bool m_isConnected;         // 当前设备是否连接
    QString m_connectionStatus; // 连接状态文本
};

#endif // MODBUSCONTROLLER_H
